Android动态加载ListView的实现以及注意事项 您所在的位置:网站首页 android listview数据动态加载 Android动态加载ListView的实现以及注意事项

Android动态加载ListView的实现以及注意事项

2023-07-29 21:54| 来源: 网络整理| 查看: 265

做安卓开发的都知道,Android中的ListView的使用率是非常高的。像我经常要用到ListView,并且经常会遇到要动态加载Item的需求,比如说,我的情况是这样的,我现在要从后台拉出用户的列表来显示,然后需要显示的数据有1000条,那我不可能一下子就把1000条数据拉下来都显示吧,首先是这样子耗流量,其次是没必要,有时候用户只看前几条就不看了,重要的是,你一下子显示1000条数据可能会导致UI很卡,用户体验差。所以正常的做法是,规定每一次拉多少条数据,如果用户将ListView拉到了底部,再向后台请求数据,再加载上去; 我下面这个例子是不能运行的,因为这里没有引进List所存放的类,也没有从后台拉取数据的代码。不过我讲一下关键点就是,设置ListView的setOnScrollListener,判断是否需要从后台拉取数据,是的话,将从后台拉取的数据用一个TempList来存放,然后再将TempList的数据添加到List去,更新Adapter,清楚TempList里面的数据;

package com.example.helloworld; import java.util.ArrayList; import com.supersenior.logic.LogicHandler; import com.supersenior.logic.params.MySubscriptionsParam; import com.supersenior.logic.results.MySubscriptionsResult; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class TestActivity extends Activity { public static final int REFRESH_ADAPTER = 1; public static final int NO_DATA = 0; //这里需要注意的是,我这里用了两个List,subscriptionsTemp是用来 做缓存的,如果你不做这个操作,每一次从后台请求数据后就直接放到subs criptions这个List里面去,那么有可能就会出现这样一种情况:你adapa ter.notifyDataSetChanged(); //的同时,又从后台拉去数据放到了subscriptions这个list里面去,这 样就会出错。 private ArrayList subscriptions; private ArrayList subscriptionsTemp; private boolean isEnd = false; private ListView listView; private Context context; private MyBaseAdapter adapter; Handler handler; private int page = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.c_my_setting_ding_yue); context = this; initUI(); } /** * @author mingwei */ // 从后台获得数据 private void getSubscriptions() { if (result.isOk == true) { subscriptionsTemp.addAll(result.subscriptionList); handler.sendEmptyMessage(REFRESH_ADAPTER); } else { handler.sendEmptyMessage(NO_DATA); } } private void initUI() { subscriptions = new ArrayList(); subscriptionsTemp = new ArrayList(); adapter = new MyBaseAdapter(context); listView = (ListView) findViewById(R.id.lv_ding_yue); listView.setAdapter(adapter); listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //这一句判断ListView是否到底了 if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount != 0 && isEnd == false) { page++; getSubscriptions(); } } }); handler = new Handler() { public void handleMessage(Message msg) { if (msg.what == REFRESH_ADAPTER) { subscriptions.addAll(subscriptionsTemp); adapter.notifyDataSetChanged(); subscriptionsTemp.clear(); } else if (msg.what == NO_DATA) isEnd = true; } }; getSubscriptions(); } class ViewHolder { ImageView ivHead; TextView tvMess; TextView tvPublisher; TextView tvPublishData; TextView tvPublishTime; ImageView imIsV; } class MyBaseAdapter extends BaseAdapter { private LayoutInflater mInflater; public MyBaseAdapter(Context context) { this.mInflater = LayoutInflater.from(context); } @Override public int getCount() { // TODO Auto-generated method stub return subscriptions.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int itemId) { // TODO Auto-generated method stub return subscriptions.get(itemId).userId; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder; Subscription subscription; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater .inflate(R.layout.item_my_ding_yue, null); holder.imIsV = (ImageView) convertView .findViewById(R.id.iv_ding_yue_v); holder.ivHead = (ImageView) convertView .findViewById(R.id.iv_ding_yue_head); holder.tvMess = (TextView) convertView .findViewById(R.id.tv_ding_yue_mes); holder.tvPublishData = (TextView) convertView .findViewById(R.id.tv_ding_yue_publish_content); holder.tvPublisher = (TextView) convertView .findViewById(R.id.tv_ding_yue_username); holder.tvPublishTime = (TextView) convertView .findViewById(R.id.tv_ding_yue_publish_time); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } if (subscriptions.size() > 0) { subscription = subscriptions.get(position); if (subscription.isVUser == true) { holder.imIsV.setBackgroundResource(R.drawable.attestation); holder.imIsV.setVisibility(View.VISIBLE); } else holder.imIsV.setVisibility(View.INVISIBLE); holder.ivHead.setBackgroundResource(R.drawable.head); if (subscription.newsNum == 0) holder.tvMess.setVisibility(View.INVISIBLE); else { holder.tvMess.setText("" + subscription.newsNum); holder.tvMess.setVisibility(View.VISIBLE); } holder.tvPublishTime.setText(subscription.lastUpdateTime); holder.tvPublisher.setText(subscription.userName); holder.tvPublishData.setText(subscription.fileInfo); } return convertView; } } }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有